//
//  NSData+AES256.m
//  多环境变量demo
//
//  Created by tcxt on 2021/7/5.
//  Copyright © 2021 zhq. All rights reserved.
//

#import "NSData+AES256.h"


@implementation NSData (AES256)

- (NSData *)aes256_encrypt:(NSString *)key   //加密
{
  char keyPtr[kCCKeySizeAES256+1];
  bzero(keyPtr, sizeof(keyPtr));
  [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
  NSUInteger dataLength = [self length];
  size_t bufferSize = dataLength + kCCBlockSizeAES128;
  void *buffer = malloc(bufferSize);
  size_t numBytesEncrypted = 0;
  CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,
                      kCCOptionPKCS7Padding | kCCOptionECBMode,
                      keyPtr, kCCBlockSizeAES128,
                      NULL,
                      [self bytes], dataLength,
                      buffer, bufferSize,
                      &numBytesEncrypted);
  if (cryptStatus == kCCSuccess) {
    return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
  }
  free(buffer);
  return nil;
}
 
 
- (NSData *)aes256_decrypt:(NSString *)key   //解密
{
  char keyPtr[kCCKeySizeAES256+1];
  bzero(keyPtr, sizeof(keyPtr));
  [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
  NSUInteger dataLength = [self length];
  size_t bufferSize = dataLength + kCCBlockSizeAES128;
  void *buffer = malloc(bufferSize);
  size_t numBytesDecrypted = 0;
  CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128,
                      kCCOptionPKCS7Padding | kCCOptionECBMode,
                      keyPtr, kCCBlockSizeAES128,
                      NULL,
                      [self bytes], dataLength,
                      buffer, bufferSize,
                      &numBytesDecrypted);
  if (cryptStatus == kCCSuccess) {
    return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
 
  }
  free(buffer);
  return nil;
}

@end
